package cn.tedu.knows.faq.controller;


import cn.tedu.knows.commons.model.Question;
import cn.tedu.knows.faq.service.IQuestionService;
import cn.tedu.knows.faq.vo.QuestionVO;
import com.github.pagehelper.PageInfo;
import com.sun.org.apache.regexp.internal.RE;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author tedu.cn
 * @since 2021-11-26
 */
@RestController
@RequestMapping("/v2/questions")
@Slf4j
public class QuestionController {

    @Autowired
    private IQuestionService questionService;

    @GetMapping("/my")
    // Spring-Security在登录时会保存登录用户信息
    // 同时提供了在控制器方法中获得登录用户信息的注解
    // 我们可以使用@AuthenticationPrincipal注解获得当前登录用户信息
    public PageInfo<Question> my(
            @AuthenticationPrincipal UserDetails user,
            Integer pageNum) {
        Integer pageSize = 8;
        if (pageNum == null) {
            pageNum = 1;
        }
        PageInfo<Question> pageInfo = questionService
                .getMyQuestion(user.getUsername(),
                        pageNum, pageSize);
        return pageInfo;
    }


    // 访问这个方法的路径就是/v1/questions
    // 这个方法是用于用户发布问题的
    @PostMapping("")
    public String createQuestion(
            @Validated QuestionVO questionVO,
            BindingResult result,
            @AuthenticationPrincipal UserDetails user) {
        log.debug("接收到表单信息:{}", questionVO);
        if (result.hasErrors()) {
            String msg = result.getFieldError().getDefaultMessage();
            return msg;
        }
        // 这里调用业务逻辑层
        questionService.saveQuestion(questionVO,
                user.getUsername());
        // 返回运行结果
        return "ok";
    }

    //查询讲师任务列表
    @GetMapping("/teacher")
    //当前登录用户必须是讲师身份才能查询讲师任务列表
    // 使用Spring-Security提供的权限验证功能实现限制
    @PreAuthorize("hasRole('ROLE_TEACHER')")
    public PageInfo<Question> teacher(
            @AuthenticationPrincipal UserDetails user,
            Integer pageNum) {
        Integer pageSize = 8;
        if (pageNum == null)
            pageNum = 1;
        // 调用业务逻辑层
        PageInfo<Question> pageInfo = questionService
                .getTeacherQuestions(user.getUsername(),
                        pageNum, pageSize);
        return pageInfo;
    }

    // 根据问题id查询问题详情
    // SpringMvc支持我们编写占位符匹配Url
    // 下面的路径{id}就是一个占位符
    // SpringMvc在请求匹配路径时会自动将匹配位置的值赋值给{id}
    // 例如 /v1/questions/149 这样的路径149就会自动赋值给{id}
    // 我们可以在控制方法中使用指定的方法获得{id}占位符的值
    @GetMapping("/{id}")
    public Question question(
            // 获得占位符{id}被赋值的方法
            // 1.必须编写@PathVariable注解
            // 2.参数的名称必须匹配{}里的名字
            @PathVariable Integer id) {
        Question question = questionService.getQuestionById(id);
        return question;
    }

    // sys模块需要根据用户id获得用户问题数
    // 这个方法是提供的Rest接口
    @GetMapping("/count")
    public Integer count(Integer userId) {
        return questionService.countQuestionsByUserId(userId);
    }

    // 分页查询全部question的方法
    @GetMapping("/page")
    public List<Question> questions(Integer pageNum, Integer pageSize) {
        // 调用编写好的业务逻辑层方法
        PageInfo<Question> pageInfo = questionService.getQuestions(pageNum, pageSize);
        return pageInfo.getList();
    }

    // 根据指定页面大小计算总页数的方法
    @GetMapping("/page/count")
    public Integer pageCount(Integer pageSize) {
        // 获得总条数
        // count()方法时MybatisPlus提供的,直接返回当前表总条数
        Integer count = questionService.count();
//        return count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
        return (count+pageSize-1)/pageSize;

    }
}







